package com.jy.modules.cims.common.sysUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

/**
 * @description 验证。
 * @version v1.0
 * @author shengzhoutao
 * @Date 2015-09-09
 */
public class ViolationUtils {
	/**
	 * @description 注解验证:
	 *              <p>
	 *              <code>@Null   被注释的元素必须为 null   </code>
	 *              <code>@NotNull 被注释的元素必须不为 null </code>
	 *              <code>@AssertTrue     被注释的元素必须为 true   </code>
	 *              <code>@AssertFalse    被注释的元素必须为 false   </code>
	 *              <code>@Min(value)     被注释的元素必须是一个数字，其值必须大于等于指定的最小值   </code>
	 *              <code>@Max(value)     被注释的元素必须是一个数字，其值必须小于等于指定的最大值   </code>
	 *              <code>@DecimalMin(value)  被注释的元素必须是一个数字，其值必须大于等于指定的最小值   </code>
	 *              <code>@DecimalMax(value)  被注释的元素必须是一个数字，其值必须小于等于指定的最大值   </code>
	 *              <code>@Size(max=, min=)   被注释的元素的大小必须在指定的范围内   </code>
	 *              <code>@Digits (integer, fraction)     被注释的元素必须是一个数字，其值必须在可接受的范围内   </code>
	 *              <code>@Past   被注释的元素必须是一个过去的日期   </code>
	 *              <code>@Future     被注释的元素必须是一个将来的日期   </code>
	 *              <code>@Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式  </code>
	 *              Hibernate Validator 附加的 constraint
	 *              <code>@NotBlank(message =)   验证字符串非null，且长度必须大于0   </code>
	 *              <code>@Email  被注释的元素必须是电子邮箱地址   </code>
	 *              <code>@Length(min=,max=)  被注释的字符串的大小必须在指定的范围内   </code>
	 *              <code>@NotEmpty   被注释的字符串的必须非空   </code>
	 *              <code>@Range(min=,max=,message=)  被注释的元素必须在合适的范围内<code/>
	 *              </p>
	 * @param parameter
	 *            参数
	 * @return messageList 错误信息
	 */
	public static <T> List<String> validate(final T parameter) {
		ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
		Validator validator = factory.getValidator();
		Set<ConstraintViolation<T>> constraintViolations = validator.validate(parameter);
		List<String> messageList = new ArrayList<String>();
		for (ConstraintViolation<T> constraintViolation : constraintViolations) {
			messageList.add(constraintViolation.getMessage());
		}
		return messageList;
	}
}
